当前位置:  开发笔记 > 编程语言 > 正文

为什么^*$匹配"127.0.0.1"

如何解决《为什么^*$匹配"127.0.0.1"》经验,为你挑选了2个好方法。

我不明白,为什么以下正则表达式:

^*$

匹配字符串"127.0.0.1"?运用Regex.IsMatch("127.0.0.1", "^*$");

使用Expresso,它不匹配,这也是我所期望的.使用表达式^.*$确实匹配字符串,我也期望.

从技术上讲,^*$应该匹配字符串/行的开头任意次,然后是字符串/行的结尾.似乎*被隐含地视为一个.*

我错过了什么?

编辑:运行以下命令以查看问题的示例.

using System;
using System.Text.RegularExpressions;

namespace RegexFubar
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Regex.IsMatch("127.0.0.1", "^*$"));
            Console.Read();
        }
    }
}

我不希望有^*$匹配我的字符串,我想知道为什么它匹配.我认为该表达式应该导致抛出异常,或者至少是不匹配.

编辑2:清除任何混乱.我没有写这个正则表达式,意图让它匹配"127.0.0.1".我们的应用程序的用户输入了表达式,并想知道为什么它不应该匹配字符串.看了之后,我无法解释为什么它匹配 - 特别是因为Expresso和.NET似乎不同地处理它.

我想这个问题是由于.NET实现避免抛出异常而得到回答,甚至认为它在技术上是一个不正确的表达式.但这真的是我们想要的吗?



1> Mecki..:

好吧,理论上你是对的,它应该不匹配.但这取决于实施如何在内部运作.大多数正则表达式.将从前面取你的正则表达式并剥离^(注意它必须从字符串的开头匹配)并从末尾剥离$(注意它必须到字符串的结尾),遗留的只是"*"和"*"本身就是一个有效的正则表达式.您正在使用的实现对于如何处理它是错误的.你可以试试如果用"*"替换"^*$"会发生什么; 我想它也会匹配一切.似乎实现将单个星号视为".*".

根据ISO/IEC 9945-2:1993标准,它也在POSIX标准中描述,它被打破了.它被打破是因为标准说在^字符之后,星号没有任何特殊含义.这意味着"^*$"实际上只匹配一个字符串,这个字符串是"*"!

引用标准:

除非使用星号,否则星号是特殊的:

在括号表达式中

作为整个BRE的第一个字符(在初始^之后,如果有的话)

作为子表达式的第一个字符(在初始^之后,如果有的话); 看BRE匹配多个字符.

因此,如果它是第一个字符(并且^如果存在则不计为第一个字符),它没有特殊含义.这意味着在这种情况下,星号应该只匹配一个字符,这是一个星号.


更新

微软说

Microsoft .NET Framework正则表达式包含其他正则表达式实现的最常用功能,例如Perl和awk中的那些..NET Framework正则表达式旨在与Perl 5正则表达式兼容,包括其他实现中尚未见到的功能,例如从右到左匹配和即时编译.

来源:http://msdn.microsoft.com/en-us/library/hs600312.aspx

好的,让我们测试一下:

# echo -n 127.0.0.1 | perl -n -e 'print (($_ =~ m/(^.*$)/)[0]),"\n";'
-> 127.0.0.1
# echo -n 127.0.0.1 | perl -n -e 'print (($_ =~ m/(^*$)/)[0]),"\n";'
->

不,它没有.Perl工作正常.^.*$匹配字符串,^*$不=> .NET的正则表达式实现被破坏,它不像Perl 5那样作为MS声明.


实际上,你会注意到他正在使用IsMatch.您的演示不正确.正则表达式匹配字符串标记的结尾,而不是整个字符串:它匹配,因此函数返回true,但匹配的CONTENTS基本上是空字符串.

2> Jon Grant..:

星号(*)匹配前面的元素ZERO或更多次.如果您想要一个或多个,请使用+运算符而不是*.

您要求它匹配字符串标记的可选开头和字符串标记的结尾.即如果我们省略字符串标记的开头,你只需要查找字符串标记的结尾...它将匹配任何字符串!

我真的不明白你想做什么.如果您可以提供更多信息,那么我可以告诉您应该做些什么:)

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有